﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLCanal
    {
        #region Metodos

        /// <summary>
        /// Devuelve la lista de canales
        /// </summary>
        /// <returns></returns>
        public List<Canal> ListarCanal()
        {
            return Accesor.ListarCanal();
        }
        /// <summary>
        /// Devuelve la lista de canales
        /// </summary>
        /// <returns></returns>
        public List<Canal> ListarCanalPorNombre(string nombreCAN)
        {
            return Accesor.ListarCanalPorNombre(nombreCAN);
        }
        /// <summary>
        /// Verificar si existe el nombre registrado
        /// </summary>
        /// <returns></returns>
        public bool VerificarExisteCanal(string nombreCAN)
        {
            bool retorno = false;
            var lista = Accesor.ListarCanalPorNombre(nombreCAN);
            if (lista.Count > 0)
            {
                retorno = true;
            }
            return retorno;
        }
        /// <summary>
        /// Registra nuevo Canal
        /// </summary>
        /// <param name="Canal"></param>
        /// <returns></returns>
        public int InsertarCanal(Canal canal)
        {
            int retorno = 0;
            if (this.VerificarExisteCanal(canal.NombreCAN))
            {
                retorno = -1;
                return retorno;
            }
            canal.CodigoCanal = Accesor.GenerarCodigoCanal();
            retorno = Accesor.InsertarCanal(canal);
            return retorno;
        }

        /// <summary>
        /// Modifica un Canal
        /// </summary>
        /// <param name="Canal"></param>
        public void ModificarCanal(Canal canal)
        {
            var canalEdit = Accesor.ObtenerCanal(canal.CodigoCanal);
            if (canalEdit != null)
            {
                canalEdit.CodigoCanal = canal.CodigoCanal;
                canalEdit.NombreCAN = canal.NombreCAN;
                canalEdit.FechaInicio = canal.FechaInicio;
                //canalEdit.FechaFin = canal.FechaFin;
                canalEdit.AnchoLabor = canal.AnchoLabor;
                canalEdit.Referencia = canal.Referencia;
                canalEdit.Observacion = canal.Observacion;
                canalEdit.Distancia = canal.Distancia;
                canalEdit.CodigoLabor = canal.CodigoLabor;
                canalEdit.CodigoZona = canal.CodigoZona;
                canalEdit.CodigoLadoCanal = canal.CodigoLadoCanal;
                canalEdit.CodigoGeologo = canal.CodigoGeologo;
                Accesor.ModificarCanal(canalEdit);
            }
        }
        /// <summary>
        /// Metodo que actualiza ubicacion canal
        /// </summary>
        /// <param name="labor"></param>
        public void ActualizarUbicacionCanal(Canal canal)
        {
            var canalEdit = Accesor.ObtenerCanal(canal.CodigoCanal);
            canalEdit.Este = canal.Este;
            canalEdit.Norte = canal.Norte;
            canalEdit.Cota = canal.Cota;
            canalEdit.Inclinacion = canal.Inclinacion;
            canalEdit.Azimut = canal.Azimut;
            Accesor.ModificarCanal(canalEdit);
        }
        /// <summary>
        /// Eliminar un Canal
        /// </summary>
        /// <param name="Canal"></param>
        public void EliminarCanal(int codigoCanal)
        {
            var canal = Accesor.ObtenerCanal(codigoCanal);
            Accesor.EliminarCanal(canal);
        }

        /// <summary>
        /// Busca Canal
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="codigoZona"></param>
        /// <param name="estado"></param>
        /// <param name="codigoCategoriaCanal"></param>
        /// <returns></returns>
        public List<buscarCanales_Result> BuscarCanal(int anio, int codigoZona, int estado, string mes)
        {
            return Accesor.BuscarCanal(anio, codigoZona, estado, mes);
        }

        /// <summary>
        /// Obtiene un Canal
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public Canal ObtenerCanal(int codigoCanal)
        {
            var canal = Accesor.ObtenerCanal(codigoCanal);
            if (canal != null)
            {
                canal.Zona = new DAZona().ObtenerZona(canal.CodigoZona);
                canal.Labor = new DALabor().Obtener((int)canal.CodigoLabor);
            }
            return canal;
        }

        /// <summary>
        /// Genera correlativo de Canal
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public int GenerarCodigoCanal()
        {
            return Accesor.GenerarCodigoCanal();
        }
        /// <summary>
        /// Genera nombre de Canal
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public string GenerarNombreCanal(int anio)
        {
            return Accesor.GenerarNombreCanal(anio);
        }

        /// <summary>
        /// Valida y finaliza canales
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public string FinalizarCanal(List<int> codigoCanales)
        {
            string result = string.Empty;
            using (TransactionScope transaction = new TransactionScope())
            {
                foreach (var codigoCanal in codigoCanales)
                {
                    result = Accesor.FinalizarCanal(codigoCanal);
                    if (result.CompareTo("Finalizado") != 0)
                    {
                        break;
                    }
                }

                if (result.CompareTo("Finalizado") == 0)
                {
                    transaction.Complete();
                }
            }

            return result;
        }
        #endregion

        #region Accesor
        private static DACanal Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DACanal(); }
        }
        #endregion
    }
}
